home *** CD-ROM | disk | FTP | other *** search
- { die ln-funktion bei MT+ ist fuer Werte kleiner 1E-5 aeussertst langsam,
- so dass man das Gefuehl bekommt, das dass Programm sich aufhaengt. In-
- folgedessen konnte ich dieses Programm nicht verifizieren. -Juergen }
-
- program diffus; { --> 302 }
-
- { Pascal program to perform a linear least-squares fit }
- { for the diffusion of Zn and Cu }
- { with Gauss-Jordan routine }
- { Sperate modules needed:
- GAUSSJ,
- PLOT }
-
-
- const maxr = 20; { data prints }
- maxc = 4; { polynomial terms }
- r = 1.987; { gas constant }
-
- type ary = array[1..maxr] of real;
- arys = array[1..maxc] of real;
- ary2 = array[1..maxr,1..maxc] of real;
- ary2s = array[1..maxc,1..maxc] of real;
-
- var
- x,y,y_calc : ary;
- t,d,resid : ary;
- coef,sig : arys;
- nrow,ncol : integer;
- correl_coef,srs : real;
-
-
- external procedure cls;
-
- procedure get_data(var x,y,t,d: ary;
- var nrow: integer);
- { get values for nrow and arrays t,d }
-
- var i : integer;
- begin
- nrow:=7;
- t[1]:=600.0; d[1]:=1.4E-12;
- t[2]:=650.0; d[2]:=5.5E-12;
- t[3]:=700.0; d[3]:=1.8E-11;
- t[4]:=750.0; d[4]:=6.1E-11;
- t[5]:=800.0; d[5]:=1.6E-10;
- t[6]:=850.0; d[6]:=4.4E-10;
- t[7]:=900.0; d[7]:=1.2E-9;
- for i:=1 to nrow do
- begin
- x[i]:=1.0/(t[i]+273.0);
- y[i]:=ln(d[i])
- end
- end; { procedure get data }
-
-
- procedure write_data;
- { print out the answers }
- var i : integer;
- begin
- writeln;
- writeln;
- writeln(' I TC D DCALC');
- for i:=1 to nrow do
- writeln(i:3,t[i]:8:0,d[i],' ',y_calc[i]);
- writeln; writeln(' Coefficients ');
- writeln(coef[1],' constant term');
- for i:=2 to ncol do
- writeln(coef[i]); { other terms }
- writeln;
- writeln('D0=',(exp(coef[1])):7:2,' cm sq/sec.');
- writeln('Q =',(-r*coef[2]/1000.0):8:2,'kcal/mole');
- writeln;writeln('SRS= ',srs:7:3)
- end; { write_data }
-
- {procedure square(x: ary2;
- y: ary;
- var a: ary2s;
- var g: arys;
- nrow,ncol: integer);}
- { matrix multiplication routine }
- { a= transpose x times x }
- { g= y times x }
-
- {$I C:SQUARE.LIB }
-
- {external procedure gaussj(var b: ary2s;
- y: arys;
- var coef: arys;
- ncol: integer;
- var error: boolean);
- }
- {$I GAUSSJ.LIB }
-
- procedure linfit(x, { independant variable }
- y: ary; { dependent variable }
- var y_calc: ary; { calculated dep. variable }
- var resid: ary; { array of residuals }
- var coef: arys; { coefficients }
- var sig: arys; { error on coefficients }
- nrow: integer; { length of array }
- var ncol: integer); { number of terms }
-
- { least squares fit to nrow sets of x and y pairs of points }
- { Seperate procedures needed:
- SQUARE -> form square coefficient matrix
- GAUSSJ -> Gauss-Jordan elimination }
-
- var xmatr : ary2; { data matrix }
- a : ary2s; { coefficient matrix }
- g : arys; { constant vector }
- error : boolean;
- i,j,nm : integer;
- see,a1 : real;
-
- begin { procedure linfit }
- ncol:=2; { number of terms }
- for i:=1 to nrow do
- begin { setup matrix }
- xmatr[i,1]:=1.0; { first column }
- xmatr[i,2]:=x[i] { second column }
- end;
- square(xmatr,y,a,g,nrow,ncol);
- gaussj(a,g,coef,ncol,error);
- srs:=0.0;
- a1:=exp(coef[1]);
- for i:=1 to nrow do
- begin
- y_calc[i]:=a1*exp(coef[2]*x[i]);
- if y[i]<>0.0 then resid[i]:=y_calc[i]/y[i]-1.0
- else resid[i]:=y[i]/y_calc[i]-1.0;
- srs:=srs+sqr(resid[i])
- end
- end; { linfit }
-
-
- begin { main program }
- cls;
- get_data(x,y,t,d,nrow);
- linfit(x,y,y_calc,resid,coef,sig,nrow,ncol);
- write_data
- end.